/*
 * Copyright 2007 by LongTop Corporation.
 * Softpack ChuangXin Building 15F, XiaMen, FuJian, PRC 361005
 *
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of
 * LongTop Corporation ("Confidential Information").  You
 * shall not disclose such Confidential Information and shall use
 * it only in accordance with the terms of the license agreement
 * you entered into with LongTop.
 * 
 */
package com.longtop.framework.common;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import com.longtop.intelliweb.common.Log;

/**
 * 应用配置文件管理类。<br>
 * <p/> 调用方式： <p/> 从默认的CONFIG_FILE_NAME配置文件中返回键值<br>
 * <p/> Config.getPropertyString(String key);<br>
 * <p/> 从默认的CONFIG_FILE_NAME配置文件中返回键值，如果不存在则返回defaultValue默认值<br>
 * <p/> Config.getPropertyString(String key,String defaultValue);<br>
 * <p/> 从默认的CONFIG_FILE_NAME配置文件中返回布尔类型值 <p/> Config.getPropertyBool(String
 * key);<br>
 * ...
 * 
 * @author IntelliWeb Team
 * @version 2.0
 */
public class Config {

	private static final Log log = Log.getLogger(Config.class);
	/**
	 * 配置文件名为applicationConfig.properties，放在src目录下，具体项目使用可修改此文件名。
	 */
	private static final String CONFIG_FILE_NAME = "applicationConfig";

	/**
	 * 缓存属性，其中的value的类型是java.util.Properties
	 */
	private static Map propertyCache = new HashMap();

	/**
	 * 取得指定属性文件中的属性
	 * 
	 * @param resource
	 *            属性文件
	 * @param name
	 *            属性key
	 * @return 属性值
	 */
	public static String getProperty(String resource, String name) {
		if (resource == null || resource.length() <= 0) {
			return null;
		}
		if (name == null || name.length() <= 0) {
			return null;
		}
		Properties props = (Properties) propertyCache.get(resource);
		if (props == null) {
			synchronized (propertyCache) {
				props = (Properties) propertyCache.get(resource);
				if (props == null) {
					props = getBaseProperties(resource);
				}
			}
			if (props == null) {
				return null;
			}
		}
		return props.getProperty(name);
	}

	/**
	 * 取得属性
	 * 
	 * @param name
	 *            key
	 * @return 对应的字符串
	 */
	public static String getProperty(String name) {
		return getProperty(CONFIG_FILE_NAME, name);
	}

	/**
	 * 取得属性文件的属性值中的属性值
	 * 
	 * @param name
	 *            key
	 * @param defaultValue
	 *            配置项的缺省值
	 * @return name对应的value
	 */
	public static String getPropertyValue(String name, String defaultValue) {
		String value = getProperty(name);
		return (value == null ? defaultValue : value);
	}

	/**
	 * 取得属性文件的属性值中的属性值
	 * 
	 * @param name
	 *            key
	 * @return name对应的属性值，字符串类型
	 */
	public static String getPropertyString(String name) {
		return getProperty(name);
	}

	/**
	 * 取得属性文件的属性值中的属性值
	 * 
	 * @param name
	 *            key
	 * @param defaultValue
	 *            配置项的缺省值
	 * @return name对应的属性值，字符串类型。如果返回的属性值为null，则取defaultValue
	 */
	public static String getPropertyString(String name, String defaultValue) {
		return getPropertyValue(name, defaultValue);
	}

	/**
	 * 取得属性文件的属性值中的属性值
	 * 
	 * @param name
	 *            key
	 * @return name对应的属性值，布尔型。为1或true时，返回true，其它（包括出错）返回false
	 */
	public static boolean getPropertyBool(String name) {
		String value = getPropertyString(name);
		try {
			return (value.equals("1") || value.compareToIgnoreCase("true") == 0);
		} catch (Exception ex) {
			return false;
		}
	}

	/**
	 * 取得属性文件的属性值中的属性值
	 * 
	 * @param name
	 *            key
	 * @param defaultValue
	 *            配置项的缺省值
	 * @return name对应的属性值，布尔型。为null时，返回缺省值; 为1或true时，返回true，其它（包括出错）返回false
	 */
	public static boolean getPropertyBool(String name, boolean defaultValue) {
		String value = getPropertyString(name, String.valueOf(defaultValue));
		try {
			return (value.equals("1") || value.compareToIgnoreCase("true") == 0);
		} catch (Exception ex) {
			return false;
		}
	}

	/**
	 * 取得属性文件的属性值中的属性值
	 * 
	 * @param name
	 *            key
	 * @return name对应的属性值，整型。出错返回0
	 */
	public static int getPropertyInt(String name) {
		String value = getPropertyString(name);
		try {
			return Integer.parseInt(value);
		} catch (Exception ex) {
			return 0;
		}
	}

	/**
	 * 取得属性文件的属性值中的属性值
	 * 
	 * @param name
	 *            key
	 * @param defaultValue
	 *            配置项的缺省值
	 * @return name对应的属性值，整型。如果返回的属性值为null，取defaultValue，出错返回0
	 */
	public static int getPropertyInt(String name, int defaultValue) {
		String value = getPropertyString(name, String.valueOf(defaultValue));
		try {
			return Integer.parseInt(value);
		} catch (Exception ex) {
			return 0;
		}
	}

	/**
	 * 取得属性文件的属性值中的属性值
	 * 
	 * @param name
	 *            key
	 * @return name对应的属性值，浮点型。出错返回0.0
	 */
	public static float getPropertyFloat(String name) {
		String value = getPropertyString(name);
		try {
			return Float.parseFloat(value);
		} catch (Exception ex) {
			return 0.0F;
		}
	}

	/**
	 * 取得属性文件的属性值中的属性值
	 * 
	 * @param name
	 *            key
	 * @param defaultValue
	 *            配置项的缺省值
	 * @return name对应的属性值，浮点型。如果返回的属性值为null，取defaultValue，出错返回0.0
	 */
	public static float getPropertyFloat(String name, float defaultValue) {
		String value = getPropertyString(name, String.valueOf(defaultValue));
		try {
			return Float.parseFloat(value);
		} catch (Exception ex) {
			return 0.0F;
		}
	}

	/**
	 * 取得属性文件的属性值中的属性值
	 * 
	 * @param name
	 *            key
	 * @return name对应的属性值，浮点型。出错返回0.0
	 */
	public static double getPropertyDouble(String name) {
		String value = getPropertyString(name);
		try {
			return Double.parseDouble(value);
		} catch (Exception ex) {
			return 0.0F;
		}
	}

	/**
	 * 取得属性文件的属性值中的属性值
	 * 
	 * @param name
	 *            key
	 * @param defaultValue
	 *            配置项的缺省值
	 * @return name对应的属性值，浮点型。如果返回的属性值为null，取defaultValue，出错返回0.0
	 */
	public static double getPropertyDouble(String name, double defaultValue) {
		String value = getPropertyString(name, String.valueOf(defaultValue));
		try {
			return Double.parseDouble(value);
		} catch (Exception ex) {
			return 0.0F;
		}
	}

	/**
	 * 取得一组属性的值，如果处在则缓存propertyCache
	 * 
	 * @param resource
	 *            属性文件的名称
	 * @return java.util.Properties形式的属性
	 */
	protected static Properties getBaseProperties(String resource) {
		ClassLoader loader = Thread.currentThread().getContextClassLoader();
		Properties props = new Properties();
		try {
			props.load(loader.getResourceAsStream(resource + ".properties"));
		} catch (Throwable t) {
			log.logError("", t);
			props = null;
		}
		if (props != null) {
			propertyCache.put(resource, props);
		}
		return props;
	}

}